package com.jiazhong.dao;

import java.sql.*;

public abstract class DBUtil {
    protected Connection conn=null;
    protected PreparedStatement ps=null;
    protected ResultSet rs=null;
    /**
     * 数据库操作封装类
     * 该类中包含以下3个方法:
     * 1.连接数据库方法
     * 2.释放资源
     * 3.执行增、删、改的方法
     */
    protected Connection getConn() throws Exception{
        /**
         * 1.获取数据库连接方法（连接数据库方法）
         */
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mysql_db?useUnicode=True?&characterEncoding=utf-8&useSSl=false&serverTimezone=Asia/Shanghai";
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
    }

    /**
     * 2.释放资源
     */
    protected void closeAll(){
        try {
            if (rs!=null){
                rs.close();
            }
            if (ps!=null){
                ps.close();
            }
            if (conn!=null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            rs=null;
            ps=null;
            conn=null;
        }
    }

    /**
     *执行增删改的方法
     * @param sql  带有问好占位符的方法
     * @param params   是sql语句？占位符的值
     *                 约束条件：？占位符的顺序和值顺序必须一致
     * @return
     */
    protected int executeUpdate(String sql,Object...params){
        try {
            //1.获取数据库连接
            this.getConn();
            //2.获取预处理对象
            ps = conn.prepareStatement(sql);
            //3.设置sql语句中？占位符的值
            //判断sql语句中是否存在？占位符
            if (params!=null&&params.length!=0){
                //循环设置sql语句中？的值
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i+1,params[i]);
                }
            }
            //执行sql语句并返回结果
            return ps.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            this.closeAll();
        }
        return 0;//执行失败或未修改表中数据
    }
}
